package com.delio.client.pagos.contratos;

import java.util.Date;
import java.util.List;

import com.delio.client.idioma.DelioConstants;
import com.delio.client.pagos.aportes.DescuentoAporte;
import com.delio.client.util.MensajeData;
import com.delio.client.util.Utilities;

import com.extjs.gxt.ui.client.data.BaseFilterPagingLoadConfig;
import com.extjs.gxt.ui.client.data.BasePagingLoadConfig;
import com.extjs.gxt.ui.client.data.BasePagingLoader;
import com.extjs.gxt.ui.client.data.BeanModel;
import com.extjs.gxt.ui.client.data.BeanModelReader;
import com.extjs.gxt.ui.client.data.FilterPagingLoadConfig;
import com.extjs.gxt.ui.client.data.ModelData;
import com.extjs.gxt.ui.client.data.PagingLoadResult;
import com.extjs.gxt.ui.client.data.PagingLoader;
import com.extjs.gxt.ui.client.data.RpcProxy;
import com.extjs.gxt.ui.client.store.ListStore;
import com.extjs.gxt.ui.client.widget.MessageBox;
import com.google.gwt.core.client.GWT;
import com.google.gwt.user.client.rpc.AsyncCallback;

public class Contratos {

	private static DelioConstants k = GWT.create(DelioConstants.class);

	private static ContratoServiceAsync ms = GWT.create(ContratoService.class);

	public static ListStore<BeanModel> store;
	public static PagingLoader<PagingLoadResult<ModelData>> loader;

	public static Integer contrato_id;
	public static Date fecha=new Date();
	public static PanelNuevoContrato panelnuevocontrato;
	public static Integer empleado_id = 0;
	public static List<DescuentoAporte> ids;
	public static Integer lenght;

	public static void getPaginate() {
		RpcProxy<PagingLoadResult<Contrato>> proxy = new RpcProxy<PagingLoadResult<Contrato>>() {

			@Override
			protected void load(Object loadConfig,
					AsyncCallback<PagingLoadResult<Contrato>> callback) {
				ms.paginateContrato((FilterPagingLoadConfig) loadConfig,
						empleado_id, callback);
			}
		};

		loader = new BasePagingLoader<PagingLoadResult<ModelData>>(proxy,
				new BeanModelReader()) {

			protected Object newLoadConfig() {
				BasePagingLoadConfig config = new BaseFilterPagingLoadConfig();
				return config;
			}

		};

		loader.setRemoteSort(true);
		store = new ListStore<BeanModel>(loader);

	}

	public static void Save(Contrato emp) {
		contrato_id = emp.getId();

		if (ids != null) {
			ms.save(emp, ids, new AsyncCallback<MensajeData>() {

				@Override
				public void onFailure(Throwable caught) {
					MessageBox.alert(k.sistemaDelio(), k.errorConexion(), null);
				}

				@Override
				public void onSuccess(MensajeData result) {

					if (result.guardado) {
						if (contrato_id != null)
							store.rejectChanges();
						else
							loader.load(0, Utilities.itemsPerPage);

						panelnuevocontrato.reset();
					} else if (!result.guardado) {

						if (result.errorTipo == 2)
							MessageBox.alert(k.sistemaDelio(),
									k.numeroDuplicado(), null);

						else if (result.errorTipo == 3)
							MessageBox.alert(
									k.sistemaDelio(),"No se puede registrar contrato, el empleado ya tiene uno vigente",
									null);

					} else
						MessageBox.alert(k.sistemaDelio(),
								k.empleadoNoGuardado(), null);
					panelnuevocontrato.reset();
				}
			});

		} else {
			ms.save(emp, new AsyncCallback<MensajeData>() {

				@Override
				public void onFailure(Throwable caught) {
					MessageBox.alert(k.sistemaDelio(), k.errorConexion(), null);
				}

				@Override
				public void onSuccess(MensajeData result) {

					if (result.guardado) {
						if (contrato_id != null)
							store.rejectChanges();
						else
							loader.load(0, Utilities.itemsPerPage);

						panelnuevocontrato.reset();
					} else if (result.errorTipo == 3)
						MessageBox.alert(k.sistemaDelio(),"No se puede registrar contrato, el empleado ya tiene uno vigente",
								null);
					else
						MessageBox.alert(k.sistemaDelio(),
								k.empleadoNoGuardado(), null);
					panelnuevocontrato.reset();
				}
			});

		}

	}

	public static void delete(Integer id) {
		ms.delete(id, new AsyncCallback<MensajeData>() {

			@Override
			public void onSuccess(MensajeData result) {
				if (result.guardado) {

					if (result.errorTipo == 0) {
						Integer offset = loader.getOffset();
						loader.load(offset, Utilities.itemsPerPage);
					} else
						MessageBox.alert(
								k.sistemaDelio(),
								"No se puede eliminar contrato,tiene datos vinculados",
								null);
				} else
					MessageBox.alert(k.sistemaDelio(), k.contratoNoEliminado(),
							null);

			}

			@Override
			public void onFailure(Throwable caught) {
				MessageBox.alert(k.sistemaDelio(), k.errorConexion(), null);

			}
		});

	}

	public static void deleteAll(String ids) {
		ms.deleteAll(ids, new AsyncCallback<MensajeData>() {

			@Override
			public void onSuccess(MensajeData result) {
				if (result.guardado) {
					Integer offset = loader.getOffset();
					loader.load(offset, Utilities.itemsPerPage);
				} else
					MessageBox.alert(k.sistemaDelio(),
							k.contratoNoEliminados(), null);

			}

			@Override
			public void onFailure(Throwable caught) {
				MessageBox.alert(k.sistemaDelio(), k.errorConexion(), null);

			}
		});

	}
	
	
	public static void terminarcontrato(){
		
		ms.terminarcontrato(contrato_id, fecha, new AsyncCallback<MensajeData>() {
			
			@Override
			public void onSuccess(MensajeData result) {
				if(result.guardado){
					Integer offset = loader.getOffset();
					loader.load(offset, Utilities.itemsPerPage);
				}
				
			}
			
			@Override
			public void onFailure(Throwable caught) {
				MessageBox.alert(k.sistemaDelio(), k.errorConexion(), null);
				
			}
		});
		
	}
	

}
